#include "message_manager.h"

static msg_node_t* msg_head;


msg_node_t* msg_get_head()
{
    return msg_head;
}

void msg_manager__create(void)
{
    
    msg_node_t* head = (msg_node_t*)malloc(sizeof(msg_node_t));
    if (head == NULL)
        printf("msg head malloc failed\n");
    head->msg_type = MSG_HEAD;
    head->count = 0;
    msg_head = head;
    head->priv = head->next = head;
}


int msg_register(int type, message_t* msg)
{
    msg_node_t* head = msg_get_head();
    msg_node_t *msg_node = (msg_node_t*)malloc(sizeof(msg_node_t));
    if (msg_node == NULL) {
        printf("msg_node malloc failed\n");
        return -1;
    }
    head->count +=1;

    msg_node->msg_type = type;
    msg_node->msg = msg;

    msg_node->next = head;
    msg_node->priv = head->priv;
    head->priv->next = msg_node;
    head->priv = msg_node;
    return 0;
}

message_t* msg_get_by_type(int type)
{
    msg_node_t* head = msg_get_head();
    while (head->msg_type != type) {
        head = head->next;
    }
    return head->msg;
}

int msg_manager_enque(int type, void* data)
{
    message_t* msg = msg_get_by_type(type);
    if (msg == NULL) {
        return -1;
    }
    return PushDataToQueue(msg->queue,data);
}

int msg_manager_deque(int type, void* data)
{
    message_t* msg = msg_get_by_type(type);
    if (msg == NULL) {
        printf("msg is not found\n");
        return -1;
    }
    return PopDataToQueue(msg->queue, data);
}
